package cc.mrbird.febs.common.utils;

import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import cc.mrbird.febs.common.entity.FebsConstant;
import cn.hutool.core.util.ObjectUtil;

/**
 * 签名封装工具类
 *
 * @author Lord
 */
public class SignUtil {

    public static void main(String[] args) throws Exception {
        // 组装SortedMap
        SortedMap<String, Object> paramMap = new TreeMap<String, Object>();
        paramMap.put("pageNum", "1");
        paramMap.put("pageSize", "10");

        String mySign = SignUtil.createSign("/admin/sys/user/sysUserList", paramMap);
        System.out.println("生成的签名是：" + mySign);
    }

    /**
     * 接口请求签名算法
     * @param apiUrl 接口全路径
     * @param paramMap 所有请求的参数
     * @return 最终生成的签名
     * @throws Exception
     */
    public static String createSign(String apiUrl, SortedMap<String, Object> paramMap) throws Exception {
        StringBuffer sb = new StringBuffer();
        Set<Entry<String, Object>> es = paramMap.entrySet(); // 所有参数按照ASCII排序（升序）
        Iterator<Entry<String, Object>> it = es.iterator();
        while (it.hasNext()) {
            Entry<String, Object> entry = it.next();
            String key = entry.getKey();
            Object value = entry.getValue();
            if (key.startsWith("encode_")) { // 如果以encode_开头的参数，说明是进行了编码，一般是富文本之类的，不进行参与签名计算
                continue;
            }
            if (ObjectUtil.isNotEmpty(value)) { // 参数值为空的不参与计算
                sb.append(key + "=" + value + "&");
            }
        }
        sb.append("apiUrl=" + apiUrl);
        sb.append("&secret=" + FebsConstant.SIGN_SECRET);
        return Md5Util.encryptionTo32Bit(sb.toString()).toUpperCase();
    }

}
